home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOpus Plus
/
DOpus Plus.iso
/
Tutorial
/
C Guide
/
Code_Fragments
/
support.c
< prev
Wrap
C/C++ Source or Header
|
1998-09-18
|
5KB
|
146 lines
/*
First routine is a simple ASL filerequester and the second does
show you how to use SelectionList() to get a destination.
*/
#include <proto/dos.h>
#include <proto/exec.h>
#include <proto/asl.h>
#include <proto/utility.h>
#include <proto/intuition.h>
extern struct Library *DOpusBase;
#include <dopus/modules.h>
/********************************************************************/
// since I did saw very strange stuff done also by average coders,
// I show you also how to work with a simple ASL filerequester...
#define TAGIF(expression,tag) ((expression) ? tag : TAG_IGNORE)
// a drawers only requester
#define FLG_DRAWER_ONLY 1 << 0
// requester should have half width of the supplied window, same height
// and should be centered...
#define FLG_CENTER 1 << 1
STRPTR GetFile( struct Window *win, ULONG flags, STRPTR title,
STRPTR initial_path, STRPTR initial_file,
STRPTR pattern, STRPTR dest )
{
struct FileRequester *request;
if( request = AllocAslRequestTags( ASL_FileRequest,
ASLFR_Window, win,
ASLFR_SleepWindow, TRUE,
ASLFR_TitleText, title,
TAGIF( initial_path, ASLFR_InitialDrawer ), initial_path,
TAGIF( initial_file, ASLFR_InitialFile ), initial_file,
TAGIF( pattern, ASLFR_InitialPattern ), pattern,
TAGIF( flags & FLG_DRAWER_ONLY, ASLFR_DrawersOnly ), TRUE,
TAGIF( flags & FLG_CENTER, ASLFR_InitialLeftEdge ), win->LeftEdge+win->Width/4,
TAGIF( flags & FLG_CENTER, ASLFR_InitialTopEdge ), win->TopEdge ,
TAGIF( flags & FLG_CENTER, ASLFR_InitialWidth ), win->Width/2 ,
TAGIF( flags & FLG_CENTER, ASLFR_InitialHeight ), win->Height ,
TAG_DONE ) )
{
if( AslRequest(request, NULL) )
{
// at this place there exist many strange constructions...
// here is the style it should be done... !
GetCurrentDirName( dest, 256 );
// AddPart() does overwrite an existing path, if the part
// to add is already a complete path...
AddPart( dest, request->fr_Drawer, 256 );
if( !(flags & FLG_DRAWER_ONLY) )
AddPart( dest, request->fr_File, 256 );
}
else
{
if( !IoErr() )
dest[0] = 0;
}
FreeAslRequest( request );
}
return dest;
}
/********************************************************************/
// Usage of SelectionList()...
typedef
{
IPCData *ipc; // your IPC pointer
struct Screen *screen; // DOpus screen pointer
Att_List *destlist; // list to hold all sources (not freed here !)
DOpusCallbackInfo *dc; // pointer (!) to the initialized structure
/* receiving datas ... */
APTR destpath; // choosed destination listerhandle
struct Window *destwin; // the window pointer of it
char outpath[256]; // does contain afterwards the full destination path
} Data;
// if this function does return NULL, this indicate the user has
// not choosed a dir
// if cd->destpath is NULL, the user has choosed a path where no destination
// lister exists.
// the needed locale strings should be no problem for you...
BOOL AskDest( Data *cd )
{
short seldir = 0;
APTR path;
cd->destpath = NULL;
cd->destlist = Att_NewList( LISTF_POOL );
while( (path = cd->dc->dc_GetDest(IPCDATA(cd->ipc), cd->outpath)) )
{
Att_NewNode( cd->destlist, cd->outpath, (ULONG) path, ADDNODEF_SORT|ADDNODEF_EXCLUSIVE);
cd->dc->dc_EndDest( IPCDATA(cd->ipc), TRUE );
}
if( Att_NodeCount(cd->destlist) > 1 )
{
seldir = SelectionList( cd->destlist, NULL, cd->screen,
DOpusGetString(locale, MSG_CHOOSE_DIR),
0, SLF_DIR_FIELD, cd->outpath,
DOpusGetString(locale, MSG_OKAY),
DOpusGetString(locale, MSG_CANCEL) );
if( seldir < 0 )
{
if( strlen(cd->outpath) )
return TRUE;
return FALSE;
}
strcpy( cd->outpath, Att_NodeName(cd->destlist, seldir) );
}
else
strcpy( cd->outpath, Att_NodeName(cd->destlist, 0) );
cd->destpath = (APTR) Att_FindNode(cd->destlist, seldir)->data;
cd->destwin = cd->dc->dc_GetWindow( cd->destpath );
return TRUE;
}